package com.example.doubledatasource.controller;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.example.doubledatasource.common.BusinessException;
import com.example.doubledatasource.common.PageResult;
import com.example.doubledatasource.common.Result;
import com.example.doubledatasource.converter.ProductConverter;
import com.example.doubledatasource.dto.ProductDTO;
import com.example.doubledatasource.entity.Product;
import com.example.doubledatasource.query.ProductQuery;
import com.example.doubledatasource.service.ProductService;
import com.example.doubledatasource.vo.ProductVO;
import jakarta.annotation.Resource;
import jakarta.validation.Valid;
import org.springframework.web.bind.annotation.*;

/**
 * 产品控制器
 *
 * @author example
 * @since 1.0.0
 */
@RestController
@RequestMapping("/api/products")
public class ProductController {

    @Resource
    private ProductService productService;

    @Resource
    private ProductConverter productConverter;

    /**
     * 分页查询产品
     * 支持多条件查询和排序
     */
    @GetMapping
    public PageResult<ProductVO> getProductsByPage(ProductQuery query) {
        // 调用Service进行分页查询
        IPage<Product> productPageResult = productService.findProductsByQuery(query);

        // 使用IPage和转换器创建PageResult
        return PageResult.success(productPageResult, productConverter::toVOList);
    }

    /**
     * 根据ID获取产品
     */
    @GetMapping("/{id}")
    public Result<ProductVO> getProductById(@PathVariable("id") Long id) {
        Product product = productService.getById(id);
        if (product == null) {
            throw new BusinessException("产品不存在");
        }
        ProductVO productVO = productConverter.toVO(product);
        return Result.success(productVO);
    }

    /**
     * 根据关键字搜索产品（分页）
     */
    @GetMapping("/search")
    public PageResult<ProductVO> searchProducts(@RequestParam("keyword") String keyword, ProductQuery query) {
        // 设置查询条件
        query.setName(keyword);

        // 调用Service进行分页查询
        IPage<Product> productPageResult = productService.findProductsByQuery(query);

        // 使用IPage和转换器创建PageResult
        return PageResult.success(productPageResult, productConverter::toVOList);
    }

    /**
     * 获取库存充足的产品（分页）
     */
    @GetMapping("/in-stock")
    public PageResult<ProductVO> getProductsInStock(ProductQuery query) {
        // 设置查询条件：有库存
        query.setInStock(true);

        // 调用Service进行分页查询
        IPage<Product> productPageResult = productService.findProductsByQuery(query);

        // 使用IPage和转换器创建PageResult
        return PageResult.success(productPageResult, productConverter::toVOList);
    }

    /**
     * 创建产品
     */
    @PostMapping
    public Result<ProductVO> createProduct(@Valid @RequestBody ProductDTO productDTO) {
        Product product = productConverter.toEntity(productDTO);
        productService.save(product);
        ProductVO productVO = productConverter.toVO(product);
        return Result.success("产品创建成功", productVO);
    }

    /**
     * 更新产品
     */
    @PutMapping("/{id}")
    public Result<ProductVO> updateProduct(@PathVariable("id") Long id, @Valid @RequestBody ProductDTO productDTO) {
        Product product = productService.getById(id);
        if (product == null) {
            throw new BusinessException("产品不存在");
        }
        productConverter.updateEntity(product, productDTO);
        productService.updateById(product);
        ProductVO productVO = productConverter.toVO(product);
        return Result.success("产品更新成功", productVO);
    }

    /**
     * 删除产品
     */
    @DeleteMapping("/{id}")
    public Result<Void> deleteProduct(@PathVariable("id") Long id) {
        boolean removed = productService.removeById(id);
        if (!removed) {
            throw new BusinessException("产品删除失败");
        }
        return Result.success("产品删除成功", null);
    }
}
